package com.bms.controller.xybank;

import com.bms.common.request.ExpenseReq;
import com.bms.common.response.ActivityResponse;
import com.bms.common.response.ExpenseResponse;
import com.bms.common.response.Result;
import com.bms.config.ExcelListExporter;
import com.bms.service.ExpenseService;
import com.bms.utils.MyResult;
import com.bms.utils.MyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Description: 明细控制层
 * Author: jingcaiqi1225@gmail.com
 * Date: 2024/11/4 16:26
 */
@RestController
@RequestMapping("/expense")
public class ExpenseController {

    @Autowired
    private ExpenseService expenseService;

    /**
     * 查询费用信息的分页请求处理方法
     * 该方法支持通过HTTP GET请求来分页查询费用信息，处理"/queryExpensesByPage"和"reader/queryExpensesByPage"两个路径的请求
     *
     * @param params 请求参数集合，包含分页查询所需的各种条件
     * @return 返回一个Map对象，其中包含了查询结果的总记录数和费用信息列表
     */
    @GetMapping(value = {"/queryExpensesByPage", "reader/queryExpensesByPage"})
    public Map<String, Object> queryExpensesByPage(@RequestParam Map<String, Object> params) {
        // 解析并设置分页参数
        MyUtils.parsePageParams(params);
        // 获取符合条件的费用记录总数
        int count = expenseService.getSearchCount(params);
        // 根据分页参数查询费用信息列表
        List<ExpenseResponse> activities = expenseService.searchActivitiesByPage(params);
        // 构造并返回查询结果的Map对象
        return MyResult.getListResultMap(0, "success", count, activities);
    }

    /**
     * 导出费用明细到Excel
     * 该方法接收一个费用请求列表，并将其导出到指定路径的Excel文件中
     *
     * @param list 费用请求列表，包含需要导出的费用信息
     * @throws IOException 当写入Excel文件时发生错误
     */
    @PostMapping(value = "/exportExpense")
    public void exportExpense(@RequestBody List<ExpenseReq> list) throws IOException {
        ExcelListExporter exporter = new ExcelListExporter();
        exporter.exportExpense(list, "D:\\Desktop\\费用明细.xlsx");
    }

    /**
     * 文件上传接口
     * 该方法接收一个multipart文件、文件类型和预算类型，然后调用服务解析Excel文件
     *
     * @param file 文件，用户上传的Excel文件
     * @param type 文件类型，用于指定文件的类别
     * @param budgetType 预算类型，用于指定费用的预算类别
     * @return 解析结果，返回一个包含解析成功或失败信息的结果对象
     */
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file, @RequestParam("type") int type, @RequestParam("budgetType") int budgetType) {
        try {
            // 尝试解析上传的Excel文件
            return expenseService.parseExcel(file.getInputStream(), type, budgetType);
        } catch (Exception e) {
            // 异常处理：打印异常信息并返回错误结果
            e.printStackTrace();
            return Result.error("文件上传失败");
        }
    }

    /**
     * 查询按机构与标识的汇总明细
     * @return 列表
     */
    @GetMapping(value = "/getExpenseTotalList")
    public Result getExpenseTotalList(){
        return Result.success(expenseService.getExpenseTotalList());
    }


    /**
     * 按照分类标识汇总每家机构的数据
     * @param list 集合
     * @throws IOException 当写入Excel文件时发生错误
     */
    @PostMapping(value = "/exportExpenseTotalList")
    public void exportExpenseTotalList(@RequestBody List<ExpenseResponse> list) throws IOException {
        ExcelListExporter exporter = new ExcelListExporter();
        exporter.exportExpenseTotalList(list, "D:\\Desktop\\按照分类标识汇总每家机构的数据.xlsx");
    }

    /**
     * 统计每家机构的条线的汇总数据
     * @return 列表
     */
    @GetMapping(value = "/getLineSummaryList")
    public Result getLineSummaryList(){
        return Result.success(expenseService.getLineSummaryList());
    }

    /**
     * 导出每家机构的条线的汇总数据
     * @param list 列表
     * @throws IOException 异常抛出
     */
    @PostMapping(value = "/exportLineSummaryList")
    public void exportLineSummaryList(@RequestBody List<ExpenseResponse> list) throws IOException {
        ExcelListExporter exporter = new ExcelListExporter();
        exporter.exportLineSummaryList(list, "D:\\Desktop\\导出每家机构的条线的汇总数据.xlsx");
    }

    /**
     * 查看机构的条线的活动明细数据
     * @return 列表
     */
    @GetMapping(value = "/getCompanySummaryList")
    public Result getCompanySummaryList(@RequestParam String companyCode){
        return Result.success(expenseService.getCompanySummaryList(companyCode));
    }

    /**
     * 导出机构的条线的活动明细数据
     * @param list 列表
     * @throws IOException 异常抛出
     */
    @PostMapping(value = "/exportCompanySummaryList")
    public void exportCompanySummaryList(@RequestBody List<ExpenseResponse> list) throws IOException {
        ExcelListExporter exporter = new ExcelListExporter();
        exporter.exportCompanySummaryList(list, "D:\\Desktop\\导出机构的条线的活动明细数据.xlsx");
    }

    /**
     * 查看客户经理的条线的活动明细数据
     * @param personnelCode 客户经理代码
     * @return 列表
     */
    @GetMapping(value = "/getPersonnelCodeSummaryList")
    public Result getPersonnelCodeSummaryList(@RequestParam String personnelCode){
        return Result.success(expenseService.getPersonnelCodeSummaryList(personnelCode));
    }

    /**
     * 导出客户经理的条线的活动明细数据
     * @param list 列表
     * @throws IOException 抛出异常
     */
    @PostMapping(value = "/exportPersonnelCodeSummaryList")
    public void exportPersonnelCodeSummaryList(@RequestBody List<ExpenseResponse> list) throws IOException {
        ExcelListExporter exporter = new ExcelListExporter();
        exporter.exportPersonnelCodeSummaryList(list, "D:\\Desktop\\导出客户经理的条线的活动明细数据.xlsx");
    }
}
